home *** CD-ROM | disk | FTP | other *** search
/ Turnbull China Bikeride / Turnbull China Bikeride - Disc 2.iso / STUTTGART / FROMUTS / UNIXLIB37B / src / unix / c / getwd < prev    next >
Text File  |  1992-03-09  |  1KB  |  53 lines

  1. static char sccs_id[] = "@(#) getcwd.c 3.0 "__DATE__" HJR";
  2.  
  3. /* getcwd.c (c) Copyright 1990 H.Rogers */
  4.  
  5. /* thanks to Andy (torq@gnu.ai.mit.edu) for the OS calls */
  6.  
  7. #include <errno.h>
  8. #include <string.h>
  9. #include <stdlib.h>
  10.  
  11. #include "sys/unix.h"
  12. #include "sys/os.h"
  13. #include "sys/param.h"
  14.  
  15. char *getwd(char *v,int l)
  16. {
  17. char b[MAXPATHLEN];
  18. register char *s,*t;
  19. register int i;
  20. int r[10];
  21. os_error *e;
  22.  
  23. s = v + l - 1;
  24.  
  25. *s = 0; for (;;)
  26.   {
  27.   r[0] = 6; r[2] = (int)b; if (e = os_swi(0x0c,r))
  28.     { __seterr(e); err: if (*s == '/') chdir(++s); return(0); }
  29.   if (b[2] == '$' && b[1] == 1) break;
  30.   if ((t = s - b[1]) <= v) { errno = ENOMEM; goto err; } s = t;
  31.   memcpy(s,b + 2,b[1]);
  32.   *--s = '/';
  33.   chdir("..");
  34.   }
  35. chdir(s+1);
  36. if (s <= v + 2) { errno = ENOMEM; return(0); }
  37. *--s = '$'; *--s = '.';
  38. r[0] = 5; r[2] = (int)b; if (e = os_swi(0x0c,r))
  39.   { __seterr(e); return(0); }
  40. if ((t = s - b[0]) <= v + 2) { errno = ENOMEM; return(0); } s = t;
  41. memcpy(s,b + 1,b[0]);
  42. *--s = ':'; *--s = ':';
  43. if (e = os_args(0,0,0,r)) { __seterr(e); return(0); }
  44. r[1] = r[0]; r[0] = 33; r[2] = (int)b; r[3] = MAXPATHLEN;
  45. if (e = os_swi(0x29,r)) { __seterr(e); return(0); }
  46. t = b; for (i = 0; i++,*t++; ); i--;
  47. if ((t = s - i) <= v) { errno = ENOMEM; return(0); } s = t;
  48. memcpy(s,b,i);
  49. *--s = '/';
  50. memcpy(v,s,v + l - s);
  51. return(v);
  52. }
  53.